001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Nov 28, 2002
005     * Time: 2:37:43 AM
006     */
007    
008    package EVolve.visualization.XYViz.ValRefViz.HotSpotViz;
009    
010    import EVolve.util.painters.StackHotspotPainter;
011    import EVolve.util.ThreadChooser;
012    import EVolve.data.Element;
013    import EVolve.visualization.AutoImage;
014    import EVolve.visualization.Dimension;
015    import EVolve.visualization.ValueDimension;
016    import EVolve.visualization.ReferenceDimension;
017    
018    import javax.swing.*;
019    import java.util.*;
020    import java.awt.event.*;
021    
022    public class StackHotspotViz extends HotSpotVisualization{
023        private ArrayList menuList;
024        private String dataFilterName[];
025        private JMenuItem itemChangThread;
026        private HashMap methodStacks;
027        private ThreadChooser td;
028        private Stack stack;
029    
030        public StackHotspotViz() {
031            super();
032            dataFilterName = new String[2];
033    
034            dataFilterName[0] = "Bytecode";
035            dataFilterName[1] = "Method";
036    
037            menuList = new ArrayList();
038            td = new ThreadChooser(imageMap,false);
039            painters[0] = new StackHotspotPainter();
040            painters[1] = painters[0];
041        }
042    
043        public Dimension[] createDimension() {
044            Dimension [] returnDimension = new Dimension[3];
045    
046            xAxis = new ValueDimension();
047            yAxis = new ReferenceDimension();
048            zAxis = new ReferenceDimension();
049    
050            returnDimension[0] = xAxis;
051            returnDimension[1] = yAxis;
052            returnDimension[2] = zAxis;
053    
054            return returnDimension;
055        }
056    
057        protected JPanel createConfigurationPanel() {
058            JPanel returnVal = super.createConfigurationPanel();
059    
060            comboPainter.removeItemAt(1);
061    
062            return returnVal;
063        }
064    
065        protected ArrayList createOptionalMenu() {
066            if (menuList.size() > 0) return null;
067    
068            menuList.clear();
069            itemChangThread = new JMenuItem("Switch thread...");
070            itemChangThread.setMnemonic(KeyEvent.VK_T);
071            itemChangThread.addActionListener(new ActionListener() {
072                public void actionPerformed(ActionEvent e) {
073                    visualize();
074                }
075            });
076    
077            menuList.add(itemChangThread);
078            return menuList;
079        }
080    
081        public void preVisualize() {
082            super.preVisualize();
083            image = null;
084            methodStacks = new HashMap();
085        }
086    
087        public void receiveElement(Element element) {
088            long threadId = zAxis.getField(element);
089    
090            switchThread(threadId);
091            long x = xAxis.getField(element);
092            long y = yAxis.getField(element);
093            long z = element.isOptional() ? Integer.MAX_VALUE : Integer.MIN_VALUE;
094    
095            phaseDetector.collectData(x/interval,y);
096            ((StackHotspotPainter)painter).setStack(stack);
097            paint(x,y,z);
098        }
099    
100        public void visualize() {
101            String selected = null;
102            if (imageMap.size() == 0 ) return;
103            while (selected==null) {
104                selected = td.showDialog();
105                if (selected != null) {
106                    image = (AutoImage)imageMap.get(new Long(selected.substring(7,selected.length())));
107                    sort();
108                    selected = null;
109                    break;
110                }
111            }
112    
113        }
114    
115        protected void switchThread(long threadId) {
116            if (currentThread != threadId) {
117                stack = (Stack)methodStacks.get(new Long(threadId));
118                if (stack == null) {
119                    stack = new Stack();
120                    methodStacks.put(new Long(threadId),stack);
121                }
122                super.switchThread(threadId);
123            }
124        }
125    
126        public Object clone() {
127            StackHotspotViz o = (StackHotspotViz)super.clone();
128            o.createOptionalMenu();
129            o.dataFilterName = new String[dataFilterName.length];
130            for (int i=0; i<dataFilterName.length; i++)
131                o.dataFilterName[i] = dataFilterName[i];
132            if (methodStacks == null) {
133                o.methodStacks = (HashMap)methodStacks.clone();
134                Iterator it = methodStacks.keySet().iterator();
135                while(it.hasNext()) {
136                    Object key = it.next();
137                    o.methodStacks.put(key, methodStacks.get(key));
138                }
139            }
140            o.td = new ThreadChooser(o.imageMap,false);
141            o.stack = (Stack)stack.clone();
142            o.menuList.clear();
143            return o;
144        }
145    }